Programming computer systems and networks to perform complex tasks is frequently accomplished through the creation and integration of component objects. Such component objects are useful for accomplishing particular tasks and thus may be replicated and used whenever performance of the particular task is needed. The component objects are also useful in that they may be combined to form more complex component objects. A complex task requires the completion of many more basic tasks. Accordingly, a component object to perform a complex task may be formed from many component objects that perform more basic tasks. A user arranging and combining more complex component objects is frequently unaware of the more basic component objects that form the more complex component objects.
When creating a project to accomplish a particular task it is desirable for the project to go through several stages such as development, testing, and final production. Changes to component objects and the relationships between objects may occur during such stages as development and testing. When propagating a change from one stage to another it becomes critical to track all changes that have been made to all component objects.